package org.jeecg.modules.wlhy.company.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.constant.CacheConstant;
import org.jeecg.modules.third.dongjiang.tax.system.dto.ApiBaseResDTO;
import org.jeecg.modules.third.dongjiang.tax.system.dto.req.enterprises.EnterprisesDTO;
import org.jeecg.modules.third.dongjiang.tax.system.service.DongjiangTaxSystemService;
import org.jeecg.modules.wlhy.company.entity.HyCompany;
import org.jeecg.modules.wlhy.company.entity.HyCompanyConfig;
import org.jeecg.modules.wlhy.company.entity.HyCompanyDTO;
import org.jeecg.modules.wlhy.company.mapper.HyCompanyMapper;
import org.jeecg.modules.wlhy.company.service.IHyCompanyConfigService;
import org.jeecg.modules.wlhy.company.service.IHyCompanyService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Date;

/**
 * @Description: hy_company
 * @Author: jeecg-boot
 * @Date:   2021-01-17
 * @Version: V1.0
 */
@Service
public class HyCompanyServiceImpl extends ServiceImpl<HyCompanyMapper, HyCompany> implements IHyCompanyService {


    @Resource
    private  HyCompanyMapper  companyMapper;

    @Resource
    private IHyCompanyConfigService companyConfigService ;


    @Override
    @CacheEvict(cacheNames= CacheConstant.CACHE_COMPANY, key="#entity.id")
    public boolean updateById(HyCompany entity) {
        return baseMapper.updateById(entity)==1;
    }

    @Override
    @Cacheable(unless="#result == null", cacheNames= CacheConstant.CACHE_COMPANY, key="#id")
    public HyCompany getById(Serializable id) {
        return baseMapper.selectById(id);
    }

    @Resource
    private  DongjiangTaxSystemService dongjiangTaxSystemService;

    /**
     * 获取分公司信息和配置信息
     * @param hyCompanyDTO
     * @return
     */
    @Override
    public  HyCompanyDTO getCompanyAndConfig(HyCompanyDTO hyCompanyDTO){
       return companyMapper.getCompanyAndConfig(hyCompanyDTO);
    }
    /**
     * 组装税务系统平台企业信息
     * @param hyCompany
     * @return
     */
    private EnterprisesDTO company2EnterprisesDTO(HyCompany hyCompany){
        EnterprisesDTO enterprisesDTO = new EnterprisesDTO();
        enterprisesDTO.setNsrmc(hyCompany.getCompanyName());//  是 纳税人名称
        enterprisesDTO.setNsrsbh(hyCompany.getCreditCode());// 是 纳税人识别号
        enterprisesDTO.setHy(hyCompany.getHy());// 道路货物运输//是 行业-填写行业代码，参 见《行业代码-名称表》2019-5-15 说明
        enterprisesDTO.setZgswskfj(hyCompany.getZgswskfj());// 是 主管税务所（科、分局）**********
        enterprisesDTO.setNsrzt(hyCompany.getNsrzt());// 是 纳税人状态（默认填写： 正常）
        enterprisesDTO.setZcdz(hyCompany.getDetailAddress());// 是 注册地址
        enterprisesDTO.setZgswjg(hyCompany.getZgswjg());// 是 主管税务局**********
        enterprisesDTO.setFddbrxm(hyCompany.getLegalName());// 是 法定代表人姓名
        enterprisesDTO.setScjydzxzqh(hyCompany.getScjydzxzqh());// 是 生产经营地址行政区划- 填写行政区划代码（市 级），参见《行政区划 代码-名称表》 2019-5-15 说明
        enterprisesDTO.setZcdzxzqh(hyCompany.getAreaCode());// 是 注册地址行政区划-填写 行政区划代码（市级）， 参见《行政区划代码- 名称表》 2019-5-15 说明
        enterprisesDTO.setJdxz(hyCompany.getJdxz());// 是 街道乡镇
        enterprisesDTO.setScjydz(hyCompany.getDetailAddress());// 是 生产经营地址
        enterprisesDTO.setJyfw(hyCompany.getRunScope());// 是 经营范围
        enterprisesDTO.setFddbrsfzjzl(hyCompany.getFddbrsfzjzl());// 是 法定代表人身份证件种 类-填写身份证件种类代 码，参见《申报表-计税 excel 页签：证件代码表》2019-5-15 说明
        enterprisesDTO.setFddbrsfzjhm(hyCompany.getFddbrsfzjhm());// 是 法定代表人身份证号码
        enterprisesDTO.setCwfzrsfzjzl(hyCompany.getCwfzrsfzjzl());// 是 财务负责人身份证件种 类-填写身份证件种类代 码，参见《申报表-计税 excel 页签：证件代码表》2019-5-15 说明
        enterprisesDTO.setCwfzrsfzjhm(hyCompany.getCwfzrsfzjhm());// 是 财务负责人身份证件号 码
        enterprisesDTO.setCwfzrgddh(hyCompany.getCwfzrgddh());// 是 财务负责人固定电话
        enterprisesDTO.setCwfzryddh(hyCompany.getCwfzryddh());// 是 财务负责人移动电话
        enterprisesDTO.setBsrxm(hyCompany.getBsrxm());// 是 办税人姓名
        enterprisesDTO.setBsrsfzjzl(hyCompany.getBsrsfzjzl());// 是 办税人身份证件种类-填 写身份证件种类代码，参 见《申报表-计税 excel 页签：证件代码表》
        enterprisesDTO.setBsrgddh(hyCompany.getBsrgddh());// 是 办税人固定电话
        enterprisesDTO.setBsryddh(hyCompany.getBsryddh());// 是 办税人移动电话
        enterprisesDTO.setZczb(hyCompany.getRegisterMoney());// 是 注册资本
        enterprisesDTO.setBsrsfzjhm(hyCompany.getBsrsfzjhm());// 是 办税人身份证件号码
        enterprisesDTO.setSwdlrmc("");//*********************** 否 税务代理人名称
        enterprisesDTO.setCwfzrdzxx(hyCompany.getCwfzrdzxx());// 是 财务负责人电子信箱
        enterprisesDTO.setBsrdzxx(hyCompany.getBsrdzxx());// 是 办税人电子信箱
        enterprisesDTO.setCyrs(hyCompany.getCyrs());// 是 从业人数
        enterprisesDTO.setFddbrgddh(hyCompany.getFddbrgddh());// 是 法定代表人固定电话
        enterprisesDTO.setFddbryddh(hyCompany.getLegalerTel());// 是 法定代表人移动电话
        enterprisesDTO.setCwfzrxm(hyCompany.getCwfzrxm());// 是 财务负责人姓名
        enterprisesDTO.setFddbrdzxx(hyCompany.getFddbrdzxx());// 是 法定代表人电子信箱 2019-7-22 新增
        enterprisesDTO.setWz(hyCompany.getWz());// 是 网址 2019-7-22 新增
        enterprisesDTO.setNsrywmc("");//*********************** 否 纳税人英文名称 2019-7-22 新增
        return enterprisesDTO;
    }

    @Override
    public ApiBaseResDTO tjTaxUpload(String companyId){
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("tax_upload_type",1);
        queryWrapper.eq("company_id",companyId);
        HyCompanyConfig hyCompanyConfig = companyConfigService.getOne(queryWrapper);
        ApiBaseResDTO apiBaseResDTO = new ApiBaseResDTO();
        if(hyCompanyConfig == null){
            apiBaseResDTO.setDesc("分公司配置数据为null！");
            return apiBaseResDTO;
        }
        if(  !StringUtils.equals( "1", hyCompanyConfig.getTjTaxUploadStatus() ) ){
            HyCompany company = this.getById(companyId) ;
            if(company == null){
                apiBaseResDTO.setDesc("分公司数据为null！");
                return apiBaseResDTO;
            }
            EnterprisesDTO enterprisesDTO = company2EnterprisesDTO(company);
            apiBaseResDTO =  dongjiangTaxSystemService.sendEnterprises(enterprisesDTO);
            Integer code =  StringUtils.isNotEmpty(apiBaseResDTO.getCode())? Integer.valueOf(apiBaseResDTO.getCode()) : 0;
            hyCompanyConfig.setTjTaxUploadStatus(code >= 100 && code < 200 ? "1":  "2");
            hyCompanyConfig.setTjTaxUploadTime(new Date());
            companyConfigService.updateById(hyCompanyConfig);
        }
        return apiBaseResDTO;
    }
}
